{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "de9208ab",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "python的版本:\t3.10.9 | packaged by Anaconda, Inc. | (main, Mar  1 2023, 18:18:15) [MSC v.1916 64 bit (AMD64)]\n",
      "sklearn的版本:\t1.2.1\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "import sklearn\n",
    "print(f\"python的版本:\\t{sys.version}\")\n",
    "print(f\"sklearn的版本:\\t{sklearn.__version__}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "474a5509",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6549ace0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Area</th>\n",
       "      <th>Price</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>240</td>\n",
       "      <td>3900000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>280</td>\n",
       "      <td>4006000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "      <td>4325000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>330</td>\n",
       "      <td>4821000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>370</td>\n",
       "      <td>5140000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Area    Price\n",
       "0   240  3900000\n",
       "1   280  4006000\n",
       "2   300  4325000\n",
       "3   330  4821000\n",
       "4   370  5140000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv(\"data/homeprices.csv\")\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b6ca1b96",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# plt.xlabel('Area(m^2)')\n",
    "# plt.ylabel('Price(RMB)')\n",
    "# plt.scatter(df.Area, df.Price, color = 'red', marker='+')\n",
    "# plt.plot([240,370], [3880000, 5140000])\n",
    "# plt.plot([240,375], [3820000, 5130000])\n",
    "# plt.plot([240,360], [3800000, 5190000])\n",
    "# plt.ticklabel_format(style='plain', axis='y')\n",
    "# plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ac9887bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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2kdZWZkuvvhi7d+//4yNC8Cpo3wBaPc2bNigCy64QOPGjXP1cZ999ln17NlT//AP/3BG9ldUVKTk5GTdc889GjFihEaPHq19+/YFZD777DNNmzZNV155pTp16qRLL71U6enp8vv9TiYmJkapqal6+OGHz8i4ALQO5QtAu/e73/1O06ZN0/r161VcXHzCnJmpvr7+jD3uokWL9P3vf/+M7Gv37t0aO3aspk6dqkWLFumPf/yjbrjhBo0ZM0aHDx92cgcOHNCBAwe0YMECFRYW6vnnn1d2drbuvffegP3927/9m/7whz+ovLz8jIwPQCu08W9LAsBZdfToUYuKirIPP/zQJkyYYI888oizbfXq1SbJsrOzLTEx0UJDQ+2dd96xxsZG++Uvf2m9e/e28PBwGzBggL3yyivO/err6+2ee+6xXr16WXh4uPXt29d+/etfBzxuXl6eBQcHm9/vd9Y1/TD1yy+/bNdff72Fh4fb4MGD7aOPPrLNmzdbYmKiRUZG2tixY62srMy538GDB+2KK66wRx99NOAxGhoabMqUKXbdddfZkSNHTjgHf/zjHy0sLMzq6uoC1vfq1csyMzNbN6EAvjHKF4B2LTMz0wYPHmxmZm+88Yb16tXLGhsbzezL8jVgwADLycmxv/3tb3bo0CGbM2eO9evXz7Kzs+2TTz6x5557zjwej61Zs8bMzGpra+1nP/uZbd682Xbu3GkvvviiderUyV5++WXncZ988knr169fwFiaylfTvrdv325Dhw61b3/723bjjTfa+vXrLT8/3y6//HKbOnXqGZuD3/72txYdHd1s/e2332533333GXscAKcmpG2PuwHA2ZWZmanvfe97kqRx48bp6NGj+stf/qJRo0Y5mXnz5mn06NGSpKqqKi1cuFDvvPOOhg0bJknq06eP1q9fr9/85jdKSkpSaGioHnnkEef+vXv31oYNG/THP/5Rt99+u6QvPib0+XwtjulHP/qRxo4dK0maPn26Jk6cqL/85S/OuWH33nuvnn/++TPy/A8fPqyf//znmjJlSrNtPXr00NatW8/I4wA4dZQvAO3WRx99pM2bN2v58uWSpJCQEE2YMEG/+93vAsrX4MGDndvbt29XdXW1U8aa1NbWatCgQc7fS5cu1X/9139pz549OnbsmGpra/Wtb33L2X7s2DGFh4e3OK4BAwY4t2NjYyVJ/fv3D1hXVlZ2Gs84UGVlpZKTk3X11Ve3eHJ9RESEPv/882/8OABah/IFoN3KzMxUfX29evTo4awzM4WGhgacaB4ZGencbmxslCS9+eabAfeTJI/HI0n64x//qJkzZ+qJJ57QsGHDFBUVpccff1ybNm1ystHR0SosLGxxXKGhoc7toKCgFtc1jeN0HTlyROPGjdOFF16oFStWBOy/yWeffaaLL774Gz0OgNajfAFol+rr6/XCCy/oiSee0JgxYwK2ffe739Uf/vAHJSQkNLvf1VdfLY/Ho+LiYiUlJbW473fffVfDhw/XD3/4Q2fdJ598EpAZNGiQlixZIjNzCpZbKisrNXbsWHk8Hr3++usnPAJXVFSkG2+80dWxAaB8AWin/vSnP6m8vFz33nuvvF5vwLZ/+Zd/UWZmpp588slm94uKitKPfvQjzZw5U42Njbr++utVWVmpDRs26MILL9Rdd92lyy+/XC+88ILefvtt9e7dW//93/+tLVu2qHfv3s5+brrpJlVVVen9999vseSdLUeOHNGYMWP0+eef68UXX1RlZaUqKyslSRdffLEuuOACSdLnn3+uvLw8/eIXv3BtbAC+wHW+ALRLmZmZGjVqVLPiJX1x5KugoED5+fkt3vfnP/+5fvaznykjI0NXXXWVxo4dqzfeeMMpV1OnTtVtt92mCRMmaMiQITp8+HDAUTBJ6tatm2677Tb94Q9/OPNP7mvk5eVp06ZNKiws1OWXX67u3bs7y969e53c//7v/+rSSy/ViBEjXB0fACnIzKytBwEA7VFhYaFGjRqlv/3tb4qKimrr4QS47rrrNGPGDE2aNKmthwJ0OBz5AoCzpH///vrVr36l3bt3t/VQApSVlelf/uVfNHHixLYeCtAhceQLAADARRz5AgAAcBHlCwAAwEWULwAAABdRvgAAAFxE+QIAAHAR5QsAAMBFlC8AAAAXUb4AAABcRPkCAABw0f8HIeks2jw2umUAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.xlabel('Area(m^2)')\n",
    "plt.ylabel('Price(RMB)')\n",
    "plt.scatter(df['Area'], df.Price, color = 'red', marker='+')\n",
    "plt.ticklabel_format(style='plain', axis='y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5024a5de",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "b7285a8e",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>LinearRegression()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">LinearRegression</label><div class=\"sk-toggleable__content\"><pre>LinearRegression()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "LinearRegression()"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reg = LinearRegression()\n",
    "reg.fit(df[['Area']], df.Price)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b9c9f603",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Area</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>280</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>330</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>370</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Area\n",
       "0   240\n",
       "1   280\n",
       "2   300\n",
       "3   330\n",
       "4   370"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[['Area']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "fa8b44e0",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Area</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>350</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Area\n",
       "0   350"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "my_data = pd.DataFrame({\"Area\": [350]})\n",
    "my_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b8e29d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "reg.predict(my_data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "42cb96e1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归模型的截距是: 1262600.8230452663\n"
     ]
    }
   ],
   "source": [
    "print(\"回归模型的截距是:\", reg.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b490cfee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "回归模型的斜率是： [10446.70781893]\n"
     ]
    }
   ],
   "source": [
    "print(\"回归模型的斜率是：\",reg.coef_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "eaf01d53",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4918945.82"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 已知直线的斜率和截距，代入直线的表达式，手动计算\n",
    "# price = m *area + b\n",
    "10446.70 * 350 + 1262600.82"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "26d0ddef",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
